//package com.juyu.miliao.scheduler.service;
//
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.fasterxml.jackson.databind.SerializationFeature;
//import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
//import com.juyu.miliao.common.util.DoubleFormatUtil;
//import com.juyu.miliao.common.util.SumAgeUtil;
//import com.juyu.miliao.scheduler.cache.GradeCache;
//import com.juyu.miliao.scheduler.dao.mysql.UserInfoDao;
//import com.juyu.miliao.scheduler.dao.redis.LineTimeRedisDao;
//import com.juyu.miliao.scheduler.domin.Grade;
//import com.juyu.miliao.scheduler.domin.Label;
//import com.juyu.miliao.scheduler.domin.User;
//import com.juyu.miliao.scheduler.util.GradeUtil;
//import com.juyu.miliao.scheduler.util.UserIsLineComparing;
//import net.sf.json.JSONArray;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.data.redis.core.ZSetOperations;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.util.*;
//
//import static java.util.Comparator.comparing;
//import static java.util.stream.Collectors.toList;
//
///**
// * 首页列表
// * 5/21 1.4.3重写
// */
//@Component
//public class HomePageListCacheService {
//
//    private final Logger qualityHostCacheLogger = LoggerFactory.getLogger("qualityHostCache");
//    @Resource
//    private StringRedisTemplate stringRedisTemplate;
//    @Resource
//    private UserInfoDao userInfoDao;
//    @Resource
//    private LineTimeRedisDao lineTimeRedisDao;
//    @Resource
//    private LabelService labelService;
//
//    /**
//     * 定时更新缓存内容
//     */
////    @Scheduled(fixedDelay = 1000 * 40, initialDelay = 1000 * 35)
//    public void executeSchedulerJob() {
//        try {
//            //优质
//            HomePageListCacheService.QualityHostQuartz qualityHost =
//                    new HomePageListCacheService.QualityHostQuartz();
//            qualityHost.call();
//            //新人
//            HomePageListCacheService.NewQualityHostQuartz newQualityHost =
//                    new HomePageListCacheService.NewQualityHostQuartz();
//            newQualityHost.call();
//            //男神
//            HomePageListCacheService.ManHostQuartz newManHostQuartz =
//                    new HomePageListCacheService.ManHostQuartz();
//            newManHostQuartz.call();
//            //颜值
//            HomePageListCacheService.BeautyHostQuartz beautyHostQuartz =
//                    new HomePageListCacheService.BeautyHostQuartz();
//            beautyHostQuartz.call();
//            //蜜桃
//            HomePageListCacheService.FigureHostQuartz figureHostQuartz =
//                    new HomePageListCacheService.FigureHostQuartz();
//            figureHostQuartz.call();
//        } catch (Exception e) {
//            qualityHostCacheLogger.error("qualityHost error={}", e);
//        }
//    }
//
//    //优质列表
//    private class QualityHostQuartz {
//        private void call() {
//            qualityHostCacheLogger.info("--首页列表--优质主播排行榜排序查询开始：");
//            List<Integer> uIdList = stringRedisTemplate.opsForZSet().reverseRange("userHostHotZset",0,-1)
//                    .stream().map(Integer::parseInt).collect(toList());
//            /** 查询列表 */
//            List<User> noTopHostList = userInfoDao.getQualityHostList(uIdList);
////            qualityHostCacheLogger.info(uIdList.size()+"@@@@@");
////            qualityHostCacheLogger.info(noTopHostList.size()+"*****");
//            List<User> topHostList = new ArrayList<>();
//            if(uIdList.size()>0){
//                topHostList = userInfoDao.getQualityHostListInUserIds(uIdList);
////                qualityHostCacheLogger.info(topHostList.size()+"@@@@@");
//            }
//            if (!noTopHostList.isEmpty()) {
//                noTopHostList.forEach(i -> {
//                    i.setIsTop(0);
//                    userIsLine(i);
//                });
//                noTopHostList = noTopHostList.stream().sorted(new UserIsLineComparing()).collect(toList());
//
//                if (noTopHostList.size() > 200)
//                    noTopHostList = noTopHostList.subList(0, 200);
//            }
//            if (!topHostList.isEmpty()) {
//                topHostList.forEach(i->{
//                    i.setIsTop(1);
//                    userIsLine(i);
//                });
//            }
//            topHostList.addAll(noTopHostList);
//            topHostList = topHostList.stream().sorted(new UserIsLineComparing()
//                    .thenComparing(comparing(User::getIsTop).reversed())).collect(toList());
//            if(topHostList.size()>0){
//                ObjectMapper mapper = new ObjectMapper();
//                List<String> returnList = new ArrayList<>(topHostList.size());
//                topHostList.forEach(i->{
//                    try {
//                        userInfoOrnament(i);
//                        returnList.add(mapper.writeValueAsString(i));
//                    } catch (JsonProcessingException e) {
//                        e.printStackTrace();
//                    }
//                });
////                qualityHostCacheLogger.info(returnList.size()+"-------");
//                stringRedisTemplate.delete("qualityHost:all");
//                stringRedisTemplate.opsForList().rightPushAll("qualityHost:all",returnList);
//            }
//            qualityHostCacheLogger.info("--首页列表--优质主播排行榜排序查询结束：");
//        }
//    }
//
//    //新人列表
//    private class NewQualityHostQuartz {
//        public void call() {
//            qualityHostCacheLogger.info("--首页列表--新人主播排行榜排序查询开始：");
//            List<Integer> uIdList = stringRedisTemplate.opsForZSet().reverseRange("userHostNewZset",0,-1)
//                    .stream().map(Integer::parseInt).collect(toList());
//            /** 查询列表 */
//            List<User> noTopHostList = userInfoDao.getNewQualityHostList(uIdList);
//            List<User> topHostList = new ArrayList<>();
//            if(uIdList.size()>0){
//                topHostList = userInfoDao.getNewQualityHostListInUserIds(uIdList);
//            }
//            if (!noTopHostList.isEmpty()) {
//                noTopHostList.forEach(i -> {
//                    i.setIsTop(0);
//                    userIsLine(i);
//                });
//                noTopHostList = noTopHostList.stream().sorted(new UserIsLineComparing()
//                        .thenComparing(comparing(User::getCreateTime).reversed())).collect(toList());
//                if (noTopHostList.size() > 200)
//                    noTopHostList = noTopHostList.subList(0, 200);
//            }
//            if (!topHostList.isEmpty()) {
//                topHostList.forEach(i->{
//                    i.setIsTop(1);
//                    userIsLine(i);
//                });
//            }
//            topHostList.addAll(noTopHostList);
//            topHostList = topHostList.stream().sorted(new UserIsLineComparing()
//                    .thenComparing(comparing(User::getIsTop).reversed())
//                    .thenComparing(comparing(User::getCreateTime).reversed())).collect(toList());
//
//            if(topHostList.size()>0){
//                ObjectMapper mapper = new ObjectMapper();
//                List<String> returnList = new ArrayList<>(topHostList.size());
//                topHostList.forEach(i->{
//                    try {
//                        userInfoOrnament(i);
//                        returnList.add(mapper.writeValueAsString(i));
//                    } catch (JsonProcessingException e) {
//                        e.printStackTrace();
//                    }
//                });
//                stringRedisTemplate.delete("newQualityHost:all");
//                stringRedisTemplate.opsForList().rightPushAll("newQualityHost:all",returnList);
//            }
//            qualityHostCacheLogger.info("--首页列表--新人排行榜排序查询结束：");
//        }
//    }
//
//    //密先生列表
//    private class ManHostQuartz {
//        public void call() {
//            qualityHostCacheLogger.info("--首页列表--密先生排行榜排序查询开始：");
//            List<Integer> uIdList = stringRedisTemplate.opsForZSet().reverseRange("userHostBoyZset",0,-1)
//                    .stream().map(Integer::parseInt).collect(toList());
//            /** 查询列表 */
//            List<User> noTopHostList = userInfoDao.getManHostList(uIdList);
//            List<User> topHostList = new ArrayList<>();
//            if(uIdList.size()>0){
//                topHostList = userInfoDao.getManHostListInUserIds(uIdList);
//            }
//            if (!noTopHostList.isEmpty()) {
//                noTopHostList.forEach(i -> {
//                    i.setIsTop(0);
//                    userIsLine(i);
//                });
//                noTopHostList = noTopHostList.stream().sorted(new UserIsLineComparing()
//                        .thenComparing(comparing(User::getCreateTime).reversed())).collect(toList());
//                if (noTopHostList.size() > 200)
//                    noTopHostList = noTopHostList.subList(0, 200);
//            }
//            if (!topHostList.isEmpty()) {
//                topHostList.forEach(i->{
//                    i.setIsTop(1);
//                    userIsLine(i);
//                });
//            }
//            topHostList.addAll(noTopHostList);
//            topHostList = topHostList.stream().sorted(new UserIsLineComparing()
//                    .thenComparing(comparing(User::getIsTop).reversed())
//                    .thenComparing(comparing(User::getCreateTime).reversed())).collect(toList());
//
//            if(topHostList.size()>0){
//                ObjectMapper mapper = new ObjectMapper();
//                List<String> returnList = new ArrayList<>(topHostList.size());
//                topHostList.forEach(i->{
//                    try {
//                        userInfoOrnament(i);
//                        returnList.add(mapper.writeValueAsString(i));
//                    } catch (JsonProcessingException e) {
//                        e.printStackTrace();
//                    }
//                });
//                stringRedisTemplate.delete("manHost:all");
//                stringRedisTemplate.opsForList().rightPushAll("manHost:all",returnList);
//            }
//            qualityHostCacheLogger.info("--首页列表--密先生排行榜排序查询结束：");
//        }
//    }
//
//    //颜值列表
//    private class BeautyHostQuartz {
//        public void call() {
//            qualityHostCacheLogger.info("--首页列表--颜值主播排行榜排序查询开始：");
//            //获取所有分值列表
//            LinkedHashMap<Long,Double> map = getLinkedMap("userHostBeautyZset");
//            if(map.size()==0){
//                qualityHostCacheLogger.info("--首页列表--颜值主播排行榜排序查询结束：颜值主播列表为空null");
//                return;
//            }
//            //获取分值大于0的list、有置顶
//            List<Long> scoresUIdList = map.entrySet().stream()
//                    .filter(obj->obj.getValue()>0)
//                    .sorted(Map.Entry.<Long,Double>comparingByValue()
//                            .reversed())
//                    .map(Map.Entry::getKey).collect(toList());
//            //获取分值等于0的list、没有置顶
//            List<Long> noScoresUIdList = map.entrySet().stream()
//                    .filter(obj->obj.getValue()<=0)
//                    .map(Map.Entry::getKey).collect(toList());
//            List<User> noScoresList = new ArrayList<>();
//            List<User> scoresList = new ArrayList<>();
//            if(noScoresUIdList.size()>0){
//                noScoresList = userInfoDao.getBeautyHostList(noScoresUIdList);
//                noScoresList.forEach(i -> {
//                    i.setIsTop(0);
//                    userIsLine(i);
//                });
//            }
//            if(scoresUIdList.size()>0){
//                scoresList = userInfoDao.getBeautyHostList(scoresUIdList);
//                scoresList.forEach(i -> {
//                    i.setIsTop(1);
//                    userIsLine(i);
//                });
//            }
//
//            scoresList.addAll(noScoresList);
//            scoresList = scoresList.stream().sorted(new UserIsLineComparing()
//                    .thenComparing(comparing(User::getIsTop).reversed())).collect(toList());
//
//            if(scoresList.size()>0){
//                ObjectMapper mapper = new ObjectMapper();
//                List<String> returnList = new ArrayList<>(scoresList.size());
//                scoresList.forEach(i->{
//                    try {
//                        userInfoOrnament(i);
//                        returnList.add(mapper.writeValueAsString(i));
//                    } catch (JsonProcessingException e) {
//                        e.printStackTrace();
//                    }
//                });
//                //清除上一次定时任务的缓存
//                stringRedisTemplate.delete("beautyHost:all");
//                stringRedisTemplate.opsForList().rightPushAll("beautyHost:all",returnList);
//            }
//            qualityHostCacheLogger.info("--首页列表--颜值主播排行榜排序查询结束：");
//        }
//    }
//
//    //蜜桃列表
//    private class FigureHostQuartz {
//        public void call() {
//            qualityHostCacheLogger.info("--首页列表--蜜桃主播排行榜排序查询开始：");
//            //获取所有分值列表
//            LinkedHashMap<Long,Double> map = getLinkedMap("userHostFigureZset");
//            if(map.size()==0){
//                qualityHostCacheLogger.info("--首页列表--颜值主播排行榜排序查询结束：颜值主播列表为空null");
//                return;
//            }
//            //获取分值大于0的list、有置顶
//            List<Long> scoresUIdList = map.entrySet().stream()
//                    .filter(obj->obj.getValue()>0)
//                    .sorted(Map.Entry.<Long,Double>comparingByValue()
//                            .reversed())
//                    .map(Map.Entry::getKey).collect(toList());
//            //获取分值等于0的list、没有置顶
//            List<Long> noScoresUIdList = map.entrySet().stream()
//                    .filter(obj->obj.getValue()<=0)
//                    .map(Map.Entry::getKey).collect(toList());
//            List<User> noScoresList = new ArrayList<>();
//            List<User> scoresList = new ArrayList<>();
//            if(noScoresUIdList.size()>0){
//                noScoresList = userInfoDao.getBeautyHostList(noScoresUIdList);
//                noScoresList.forEach(i -> {
//                    i.setIsTop(0);
//                    userIsLine(i);
//                });
//            }
//            if(scoresUIdList.size()>0){
//                scoresList = userInfoDao.getBeautyHostList(scoresUIdList);
//                scoresList.forEach(i -> {
//                    i.setIsTop(1);
//                    userIsLine(i);
//                });
//            }
//
//            scoresList.addAll(noScoresList);
//            scoresList = scoresList.stream().sorted(new UserIsLineComparing()
//                    .thenComparing(comparing(User::getIsTop).reversed())).collect(toList());
//
//            if(scoresList.size()>0){
//                ObjectMapper mapper = new ObjectMapper();
//                List<String> returnList = new ArrayList<>(scoresList.size());
//                scoresList.forEach(i->{
//                    try {
//                        userInfoOrnament(i);
//                        returnList.add(mapper.writeValueAsString(i));
//                    } catch (JsonProcessingException e) {
//                        e.printStackTrace();
//                    }
//                });
//                //清除上一次定时任务的缓存
//                stringRedisTemplate.delete("figureHost:all");
//                stringRedisTemplate.opsForList().rightPushAll("figureHost:all",returnList);
//            }
//            qualityHostCacheLogger.info("--发现--蜜桃主播排行榜排序查询结束：");
//        }
//    }
//
//
//
//    /**
//     * 设置主播列表基础信息
//     * @param user
//     */
//    private void userInfoOrnament(User user){
//        List<Grade> mgradeList = GradeCache.INSTANCE.getGradeList(1);
//        List<Grade> vgradeList = GradeCache.INSTANCE.getGradeList(2);
//        //魅力等级
//        user.setmGrade(GradeUtil.getGradeCount(mgradeList, user.getmGradeSum()));
//        // 土豪等级
//        user.setvGrade(GradeUtil.getGradeCount(vgradeList, user.getvGradeSum()));
//
//        // 生日转换成年龄
//        if (user.getBirthday() != null) {
//            user.setAge(SumAgeUtil.getAgeByBirth(user.getBirthday()));
//            user.setBirthdayInstant(user.getBirthday().toString());
//        }
//        List<Label> labels = labelService.getLabelCountByUserId(user.getUserId());
//        if(labels.size() > 3){
//            labels = new ArrayList<>(labels.subList(0,3));
//        }
//        user.setLabelList(labels);
//        //获取接通率
//        double callSum = user.getCallSuccessSum() + user.getCallFailSum();
//        if (callSum != 0) {
//            double rate = (Double.parseDouble(user.getCallSuccessSum() + "") / callSum);
//            user.setCallRate(DoubleFormatUtil.intFormate(DoubleFormatUtil.doubleFormate(rate) * 100) + "%");
//        } else {
//            user.setCallRate("100%");
//        }
//    }
//
//    /**
//     * 设置主播在线状态
//     * 0离线、1在线、2繁忙、3勿扰
//     * @param user
//     */
//    private void userIsLine(User user){
//        // 判断用户是否在线
//        if (lineTimeRedisDao.isMember(user.getUserId() + ""))
//            user.setIsLine(1);
//        //如果用户为主播且正在通话中，则为繁忙状态
//        if (lineTimeRedisDao.findHostCall(user.getUserId() + ""))
//            user.setIsLine(2);
//        // 判断用户是否勿扰
//        if (user.getIsVideo() == 2)
//            user.setIsLine(3);
//    }
//
//    /**
//     * 根据分值倒序，获取ZSet--value|score
//     * @param zset key
//     * @return map<value,score>
//     */
//    private LinkedHashMap<Long,Double> getLinkedMap(String key){
//        Set<ZSetOperations.TypedTuple<String>> reverseRangeWithScores = stringRedisTemplate.opsForZSet().
//                reverseRangeWithScores(key, 0, -1);
//        Iterator<ZSetOperations.TypedTuple<String>> iterator = reverseRangeWithScores.iterator();
//        LinkedHashMap<Long,Double> map = new LinkedHashMap<>(reverseRangeWithScores.size());
//        while(iterator.hasNext()){
//            ZSetOperations.TypedTuple<String> next = iterator.next();
//            map.put(Long.parseLong(next.getValue()),next.getScore());
//        }
//        return map;
//    }
//}
